home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / STRINGS / OBJSTR / OBJSTR.PAS
Pascal/Delphi Source File  |  1993-11-17  |  9KB  |  345 lines

  1. Unit ObjStr;
  2.  
  3. { During the creation of many programs, I have been bugged by the fact that
  4.   every "standard" string declared takes up 256 bytes of memory.  If you try
  5.   to work around this by declaring 'AVariable : String[5]' or some such, you
  6.   then have to turn off Var-String checking when passing these variables to
  7.   functions and procedures expecting variables of type 'String'.  Writing
  8.   your own procedures and functions for these variables has the same draw-
  9.   back.  This is my second attempt at another solution.  The first attempt
  10.   was implemented for a graphics mode program, was much more complicated,
  11.   and was (is) too hard to maintain.  I think this unit worked out better.
  12.   As far as overhead is concerned, each instance requires 8 bytes (7 for
  13.   object fields, 1 for length byte) plus the number of chars for that type.
  14.   In other words, an instance of object type Str10 would require 18 bytes.
  15.   You have the plusses of working with objects (encapsulation, extensibilty,
  16.   ...etc.) and bypassing the Var-string checking problems that 'String[10]'
  17.   poses.  On the minus side, if you're the type who doesn't mind turning off
  18.   Var-string checking and declaring all those different string types, this
  19.   approach "wastes" 8 bytes per variable.  With those 8 bytes, however,
  20.   comes the freedom to use Str10.Val as type String.
  21.  
  22.   This unit works with TP 5.5 & 6.0 (just compile with appropriate version).
  23.   This code may be freely copied and distributed.  The user of this unit may
  24.   not hold me liable for any damages resulting from the use or misuse of
  25.   this unit.  Any modifications to this unit should be noted if modified
  26.   code is distributed.  Comments, questions, and optional monetary contribu-
  27.   tions should be made to:
  28.                              Jim Fralix
  29.                              1923 Piper Drive Dr.
  30.                              Charleston, SC  29414
  31.                              (803) 766-9870
  32.                              Compuserve [72317,3614]
  33.                              jim@nms.cnsy-ian.navy.mil
  34. }
  35.  
  36. Interface
  37.  
  38.    Const
  39.  
  40.       Zero : Byte = 0;
  41.  
  42.    Type
  43.  
  44.       StrPtr = ^String;
  45.  
  46.       StringObj = Object           { Do not Define an instance of this, as
  47.                                      Size is never defined }
  48.  
  49.          Constructor Init;                         { Allocates memory for
  50.   MUST be called before using other functions        the string }
  51.  
  52.          Procedure Read; Virtual;                  { Reads CR terminated
  53.   Ex. StringObj.Read;                                String from keyboard,
  54.                                                      truncates to max len. }
  55.  
  56.          Procedure Write; Virtual;                 { Writes String value
  57.   Ex. StringObj.Write;                               to Screen (TextMode) }
  58.  
  59.          Procedure SetTo (InStr : String); Virtual;{ Set string value equal
  60.   Ex. StringObj.SetTo (InStr);                       to InStr, truncates if
  61.                                                      necessary}
  62.  
  63.          Function Value : String; Virtual;         { Returns string value,
  64.   Ex. NormStr := StrObj.Value;                       useful in standard
  65.   Ex. Writeln ('Object String = ',StringObj.Value);  procs & funcs needing
  66.                                                      a "normal" string     }
  67.  
  68.          Destructor Done;                          { Delallocates memory   }
  69.  
  70.          Private
  71.  
  72.          S    : pointer; { To Access as String w/length Byte at index 0 }
  73.  
  74.          Size : Byte;    { Stores max length, set by init procedure }
  75.  
  76.       End;
  77.  
  78.       { THESE ARE THE USABLE OBJECTS - TO IMPLEMENT A NEW STRING SIZE, JUST
  79.         DEFINE IT AND CODE THE APPROPRIATE 'INIT' CONSTRUCTOR }
  80.  
  81.       Str2 = Object (StringObj)
  82.          Constructor Init;  { Sets Size to 2, allocates memory }
  83.       End;
  84.  
  85.       Str3 = Object (StringObj)
  86.          Constructor Init;  { Sets Size to 3, allocates memory }
  87.       End;
  88.  
  89.       Str4 = Object (StringObj)
  90.          Constructor Init;  { Sets Size to 4, allocates memory }
  91.       End;
  92.  
  93.       Str5 = Object (StringObj)
  94.          Constructor Init;  { You should have the idea by now! }
  95.       End;
  96.  
  97.       Str7 = Object (StringObj)
  98.          Constructor Init;
  99.       End;
  100.  
  101.       Str8 = Object (StringObj)
  102.          Constructor Init;
  103.       End;
  104.  
  105.       Str10 = Object (StringObj)
  106.          Constructor Init;
  107.       End;
  108.  
  109.       Str12 = Object (StringObj)
  110.          Constructor Init;
  111.       End;
  112.  
  113.       Str15 = Object (StringObj)
  114.          Constructor Init;
  115.       End;
  116.  
  117.       Str18 = Object (StringObj)
  118.          Constructor Init;
  119.       End;
  120.  
  121.       Str20 = Object (StringObj)
  122.          Constructor Init;
  123.       End;
  124.  
  125.       Str25 = Object (StringObj)
  126.          Constructor Init;
  127.       End;
  128.  
  129.       Str30 = Object (StringObj)
  130.          Constructor Init;
  131.       End;
  132.  
  133.       Str35 = Object (StringObj)
  134.          Constructor Init;
  135.       End;
  136.  
  137.       Str40 = Object (StringObj)
  138.          Constructor Init;
  139.       End;
  140.  
  141.       Str50 = Object (StringObj)
  142.          Constructor Init;
  143.       End;
  144.  
  145.       Str60 = Object (StringObj)
  146.          Constructor Init;
  147.       End;
  148.  
  149.       Str70 = Object (StringObj)
  150.          Constructor Init;
  151.       End;
  152.  
  153.       Str80 = Object (StringObj)
  154.          Constructor Init;
  155.       End;
  156.  
  157.       Str90 = Object (StringObj)
  158.          Constructor Init;
  159.       End;
  160.  
  161.       Str100 = Object (StringObj)
  162.          Constructor Init;
  163.       End;
  164.  
  165.    Var
  166.  
  167.       TempStr : String;    { Sometimes you gotta have a standard string! }
  168.  
  169. Implementation
  170.  
  171.    Constructor StringObj.Init;  { Called by the other INIT Procedures }
  172.    Begin
  173.       GetMem (S, Size+1);          { Allocate mem. for length byte & chars }
  174.       Move (Zero, S^, 1);          { Init to null String (length byte of 0) }
  175.    End;
  176.  
  177.    Procedure StringObj.Read;    { Read CR terminated string from input }
  178.    Begin
  179.       Readln (TempStr);
  180.       Move (TempStr, StrPtr(S)^, Size+1);
  181.       If (Length (TempStr) > Size) then     { need to truncate }
  182.          Move (Size, StrPtr(S)^, 1);
  183.    End;
  184.  
  185.    Procedure StringObj.Write;   { WritesString at current cursor location }
  186.    Begin
  187.       System.Write (StrPtr(S)^);
  188.    End;
  189.  
  190.    Procedure StringObj.SetTo (InStr : String);  { Sets value of StringObj }
  191.    Begin
  192.       Move (InStr, StrPtr(S)^, Size+1);
  193.       If (Length(InStr) > Size) then        { need to truncate }
  194.          Move (StrPtr(S)^, Size, 1);
  195.    End;
  196.  
  197.    Function StringObj.Value : String;  { Returns string value of StringObj }
  198.    Begin
  199.       Value := StrPtr(S)^;
  200.    End;
  201.  
  202.    Destructor StringObj.Done;     { Releases Memory }
  203.    Begin
  204.       FreeMem (S, Size+1);
  205.    End;
  206.  
  207.    Constructor Str2.Init;
  208.    Begin
  209.       Size := 2;
  210.       StringObj.Init;
  211.    End;
  212.  
  213.    Constructor Str3.Init;
  214.    Begin
  215.       Size := 3;
  216.       StringObj.Init;
  217.    End;
  218.  
  219.    Constructor Str4.Init;
  220.    Begin
  221.       Size := 4;
  222.       StringObj.Init;
  223.    End;
  224.  
  225.    Constructor Str5.Init;
  226.    Begin
  227.       Size := 5;
  228.       StringObj.Init;
  229.    End;
  230.  
  231.    Constructor Str7.Init;
  232.    Begin
  233.       Size := 7;
  234.       StringObj.Init;
  235.    End;
  236.  
  237.    Constructor Str8.Init;
  238.    Begin
  239.       Size := 8;
  240.       StringObj.Init;
  241.    End;
  242.  
  243.    Constructor Str10.Init;
  244.    Begin
  245.       Size := 10;
  246.       StringObj.Init;
  247.    End;
  248.  
  249.    Constructor Str12.Init;
  250.    Begin
  251.       Size := 12;
  252.       StringObj.Init;
  253.    End;
  254.  
  255.    Constructor Str15.Init;
  256.    Begin
  257.       Size := 15;
  258.       StringObj.Init;
  259.    End;
  260.  
  261.    Constructor Str18.Init;
  262.    Begin
  263.       Size := 18;
  264.       StringObj.Init;
  265.    End;
  266.  
  267.    Constructor Str20.Init;
  268.    Begin
  269.       Size := 20;
  270.       StringObj.Init;
  271.    End;
  272.  
  273.    Constructor Str25.Init;
  274.    Begin
  275.       Size := 25;
  276.       StringObj.Init;
  277.    End;
  278.  
  279.    Constructor Str30.Init;
  280.    Begin
  281.       Size := 30;
  282.       StringObj.Init;
  283.    End;
  284.  
  285.    Constructor Str35.Init;
  286.    Begin
  287.       Size := 35;
  288.       StringObj.Init;
  289.    End;
  290.  
  291.    Constructor Str40.Init;
  292.    Begin
  293.       Size := 40;
  294.       StringObj.Init;
  295.    End;
  296.  
  297.    Constructor Str50.Init;
  298.    Begin
  299.       Size := 50;
  300.       StringObj.Init;
  301.    End;
  302.  
  303.    Constructor Str60.Init;
  304.    Begin
  305.       Size := 60;
  306.       StringObj.Init;
  307.    End;
  308.  
  309.    Constructor Str70.Init;
  310.    Begin
  311.       Size := 70;
  312.       StringObj.Init;
  313.    End;
  314.  
  315.    Constructor Str80.Init;
  316.    Begin
  317.       Size := 80;
  318.       StringObj.Init;
  319.    End;
  320.  
  321.    Constructor Str90.Init;
  322.    Begin
  323.       Size := 90;
  324.       StringObj.Init;
  325.    End;
  326.  
  327.    Constructor Str100.Init;
  328.    Begin
  329.       Size := 100;
  330.       StringObj.Init;
  331.    End;
  332.  
  333. End.
  334.  
  335.  
  336.  
  337. RFC-822-headers:
  338. Received: from cnsy-ian.navy.mil (nms.cnsy-ian.navy.mil) by worldbank.org (PMDF
  339.  #2760 ) id <01H440NCDZ4W9AMEO0@worldbank.org>; Thu, 14 Oct 1993 17:47:34 EDT
  340. Received: from ns00.cnsy-ian.navy.mil (smtp.cnsy-ian.navy.mil) by
  341.  cnsy-ian.navy.mil (4.1/SMI-4.1-DNI) id AA00619; Thu, 14 Oct 93 17:48:09 EDT
  342. Received: by ns00.cnsy-ian.navy.mil with VINES ; Thu, 14 Oct 93 17:47:26 EDT
  343. X-Envelope-to: "ERIC ENGELMANN"@a1.worldbank.org
  344. Content-transfer-encoding: 7BIT
  345.